// #include "./http.hpp"

// void Slpit_test()
// {
//     std::string str = "abc,,,d,ef,,";
//     std::vector<std::string> array;
//     Util::Split(str, ",", &array);
//     for (auto str : array)
//     {
//         std::cout << str << std::endl;
//     }
// }

// void ReadFile_test()
// {
//     std::string filename = "../log.hpp";
//     std::string buf;
//     Util::ReadFile(filename, &buf);
//     std::cout << buf << std::endl;
// }

// void WriteFile_test()
// {
//     std::string filename = "../log.hpp";
//     std::string buf;
//     Util::ReadFile(filename, &buf);
//     std::string file = "./file.txt";
//     Util::WriteFile(file, buf);
//     // md5sum ../log.hpp
//     // md5sum ./file/txt
// }

// int main()
// {
//     std::cout << Util::ValidPath("/html/../../index.html") << std::endl;
//     std::cout << Util::IsRegular("main.cc") << std::endl;
//     std::cout << Util::IsRegular("testdir") << std::endl;
//     std::cout << Util::IsDirectory("main.cc") << std::endl;
//     std::cout << Util::IsDirectory("testdir") << std::endl;
//     std::string str = "C  ";
//     std::string res = Util::UrlEncode(str, true);
//     std::string tmp = Util::UrlDecode(res, true);
//     std::cout << "[" <<res << "]\n";
//     std::cout << "[" <<tmp << "]\n";
//     // Slpit_test();
//     // ReadFile_test();
//     // WriteFile_test();
//     return 0;
// }

#include "./http.hpp"

#define WWWROOT "./wwwroot/"

std::string RequestStr(const HttpRequest &req)
{
    std::stringstream ss;
    ss << req._method << " " << req._path << " " << req._version << "\r\n";
    for (auto &[key, val] : req._params)
    {
        ss << key << ": " << val << "\r\n";
    }

    for (auto &[key, val] : req._headers)
    {
        ss << key << ": " << val << "\r\n";
    }

    ss << "\r\n";
    ss << req._body;

    return ss.str();
}

void Hello(const HttpRequest &req, HttpResponse *rsp)
{
    rsp->SetContent(RequestStr(req), "text/plain");
}
void Login(const HttpRequest &req, HttpResponse *rsp)
{
    rsp->SetContent(RequestStr(req), "text/plain");
}
void PutFile(const HttpRequest &req, HttpResponse *rsp)
{
    std::string pathname = WWWROOT + req._path;
    Util::WriteFile(pathname, req._body);
}
void DelFile(const HttpRequest &req, HttpResponse *rsp)
{
    rsp->SetContent(RequestStr(req), "text/plain");
}

int main()
{
    HttpServer server(8080);
    server.SetThreadCount(3);
    server.SetBaseDir(WWWROOT);

    server.Get("/hello", Hello);
    server.Post("/login", Login);
    server.Put("/1234.txt", PutFile);
    server.Delete("/1234.txt", DelFile);
    server.Listen();
    return 0;
}
